home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2000 #4 / Amiga Plus CD - 2000 - No. 4.iso / Tools / Musik / Misc / Amster / Source / chat.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-05-27  |  6.0 KB  |  257 lines

  1. /*
  2. ** Chat Window
  3. */
  4.  
  5. #include "include/config.h"
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10.  
  11. #include "include/mui.h"
  12. #include <MUI/NListview_mcc.h>
  13.  
  14. #include "include/gui.h"
  15. #include "include/msg.h"
  16. #include "include/chat.h"
  17. #include "include/panel.h"
  18. #include "include/napster.h"
  19. #include "amster_Cat.h"
  20.  
  21. channel chat_chans = NULL;
  22.  
  23. ULONG chat_new(struct IClass *cl, Object *obj, struct opSet *msg);
  24. MUIF chat_msgdisp(REG(a2) char **array, REG(a1) struct chatmsg *m);
  25. void chat_say(struct chatdata *data, char *user, char *msg);
  26. void chat_saysys(struct chatdata *data, char *msg);
  27. void chat_echo(struct chatdata *data, char *msg);
  28. void chat_command(struct chatdata *data);
  29. channel chat_findchan(char *name);
  30.  
  31.  
  32. MUIF chat_dispatch(REG(a0) struct IClass *cl,REG(a2) Object *obj,REG(a1) Msg msg)
  33. {
  34.     struct chatdata *data = INST_DATA(cl,obj);
  35.  
  36.     switch(msg->MethodID) {
  37.         case OM_NEW: return(chat_new(cl,obj,(APTR)msg));
  38.         case CHAT_COMMAND:
  39.             chat_command(data);
  40.             return(0);
  41.         case CHAT_JOINACK:
  42.             data->chn.joinflag = 2;
  43.             chat_saysys(data,"joined.");
  44.             return(0);
  45.         case CHAT_PUBLICMSGRECV:
  46.             chat_say(data,(char *)(((muimsg)msg)->arg1),(char *)(((muimsg)msg)->arg2));
  47.             return(0);
  48.         case CHAT_JOINMSG:
  49.             DoMethod(data->userlist,MUIM_NList_InsertSingle,(char *)(((muimsg)msg)->arg1),MUIV_NList_Insert_Bottom);
  50.             return(0);
  51.         case CHAT_USERPART:
  52.             /* fix me */
  53.             return(0);
  54.         case CHAT_CHANNELTOPIC:
  55.             set(data->topicstr,MUIA_String_Contents,((muimsg)msg)->arg1);
  56.             return(0);
  57.  
  58.     }
  59.     return(DoSuperMethodA(cl,obj,msg));
  60. }
  61.  
  62.  
  63. ULONG chat_new(struct IClass *cl, Object *obj, struct opSet *msg)
  64. {
  65.     static struct Hook msgdispHook = { {0,0}, &chat_msgdisp, NULL, NULL };
  66.     struct chatdata *data;
  67.     Object *rect,*chantxt,*topicstr,*msglist,*userlist,*msgstr;
  68.  
  69.     obj = (Object *)DoSuperNew(cl,obj,
  70.         MUIA_Window_Title, "Amster Chat",
  71.         MUIA_Window_ID, MAKE_ID('C','H','A','T'),
  72.         WindowContents, VGroup,
  73.             Child, rect = HGroup,
  74.                 Child, chantxt = TextObject,
  75.                     MUIA_HorizWeight, 0,
  76.                     MUIA_Text_Contents, "#none",
  77.                 End,
  78.                 Child, topicstr = StringObject,
  79.                     StringFrame,
  80.                     MUIA_CycleChain, 1,
  81.                 End,
  82.             End,
  83.             Child, HGroup,
  84.                 Child, NListviewObject,
  85.                     MUIA_HorizWeight, 75,
  86.                     MUIA_NListview_NList, msglist = NListObject,
  87.                         ReadListFrame,
  88.                         MUIA_NList_Input, FALSE,
  89.                         MUIA_NList_Format, "BAR P=\33r,",
  90.                         MUIA_NList_DisplayHook, &msgdispHook,
  91.                         MUIA_NList_DefaultObjectOnClick, FALSE,
  92.                         MUIA_NList_AutoVisible, TRUE,
  93.                         MUIA_NList_AutoCopyToClip, TRUE,
  94.                         MUIA_NList_TypeSelect, MUIV_NList_TypeSelect_Char,
  95.                     End,
  96.                 End,
  97.                 Child, BalanceObject, End,
  98.                 Child, NListviewObject,
  99.                     MUIA_HorizWeight, 25,
  100.                     MUIA_NListview_NList, userlist = NListObject,
  101.                         InputListFrame,
  102.                         MUIA_NList_DefaultObjectOnClick, FALSE,
  103.                         MUIA_NList_ConstructHook, MUIV_NList_ConstructHook_String,
  104.                         MUIA_NList_DestructHook, MUIV_NList_DestructHook_String,
  105.                         MUIA_CycleChain, 1,
  106.                     End,
  107.                 End,
  108.             End,
  109.             Child, msgstr = StringObject,
  110.                 StringFrame,
  111.                 MUIA_CycleChain, 1,
  112.             End,
  113.         End,
  114.         TAG_MORE, msg->ops_AttrList);
  115.  
  116.     if(!obj) return(0);
  117.  
  118.     data = INST_DATA(cl,obj);
  119.     data->rect = rect;
  120.     data->chantxt = chantxt;
  121.     data->topicstr = topicstr;
  122.     data->msglist = msglist;
  123.     data->userlist = userlist;
  124.     data->msgstr = msgstr;
  125.  
  126.     data->chn.next = chat_chans;
  127.     chat_chans = &data->chn;
  128.     data->chn.joinflag = 0;
  129.     data->chn.name = NULL;
  130.     data->chn.win = obj;
  131.  
  132.     DoMethod(msgstr,MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,obj,1,CHAT_COMMAND);
  133.     DoMethod(msgstr,MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,obj,3,MUIM_Set,MUIA_Window_ActiveObject,msgstr);
  134.  
  135.     DoMethod(obj,MUIM_Notify,MUIA_Window_CloseRequest,TRUE,MUIV_Notify_Application,5,MUIM_Application_PushMethod,gui->iconpanel,2,PANEL_DISPOSECHAT,obj);
  136.  
  137.     return((ULONG)obj);
  138. }
  139.  
  140.  
  141. MUIF chat_msgdisp(REG(a2) char **array, REG(a1) struct chatmsg *m)
  142. {
  143.     *array++ = m->user;
  144.     *array = m->msg;
  145.     return(0);
  146. }
  147.  
  148.  
  149. void chat_say(struct chatdata *data, char *user, char *msg)
  150. {
  151.     struct chatmsg *m;
  152.  
  153.     m = malloc(sizeof(struct chatmsg));
  154.     if (!m) return;
  155.  
  156.     m->user = strdup(user);
  157.     m->msg = strdup(msg);
  158.  
  159.     DoMethod(data->msglist,MUIM_NList_InsertSingleWrap,m,MUIV_NList_Insert_Bottom,2,NULL);
  160.     set(data->msglist,MUIA_NList_First,MUIV_NList_Active_Bottom);
  161. }
  162.  
  163.  
  164. void chat_saysys(struct chatdata *data, char *msg)
  165. {
  166.     chat_say(data,"\33b***",msg);
  167. }
  168.  
  169.  
  170. void chat_echo(struct chatdata *data, char *msg)
  171. {
  172.     chat_say(data,"\33b»",msg);
  173. }
  174.  
  175.  
  176. void chat_command(struct chatdata *data)
  177. {
  178.     u_long tmp;
  179.     char *com;
  180.  
  181.     GetAttr(MUIA_String_Acknowledge,data->msgstr,&tmp);
  182.     com = (char *)tmp;
  183.  
  184.     if(!gui_napon) {
  185.         chat_saysys(data,"connect to server first!");
  186.  
  187.     } else if(com[0]=='/') {
  188.         if(strnicmp("join",com+1,4)==0 && strlen(com)>6) {
  189.             data->chn.name = strdup(com+6);
  190.             nap_sendbuf(NAPC_CHANNELJOIN,data->chn.name);
  191.             data->chn.joinflag = 1;
  192.             chat_saysys(data,"joining...");
  193.         }
  194.  
  195.     } else {
  196.         if(data->chn.joinflag==2) {
  197.             chat_echo(data,com);
  198.             sprintf(nap_buf,"%s %s",data->chn.name,com);
  199.             nap_send(NAPC_PUBLICMSGSEND);
  200.         } else {
  201.             chat_saysys(data,"not joined!");
  202.         }
  203.     }
  204.  
  205.     set(data->msgstr,MUIA_String_Contents,NULL);
  206. }
  207.  
  208.  
  209. void chat_interpret(u_int com, char *data)
  210. {
  211.     channel c;
  212.  
  213.     switch(com) {
  214.         case NAPC_PUBLICMSGRECV:
  215.             c = chat_findchan(nap_token(&data));
  216.             if(!c) break;
  217.             DoMethod(c->win,CHAT_PUBLICMSGRECV,nap_token(&data),data);
  218.             break;
  219.         case NAPC_JOINACK:
  220.             c = chat_findchan(data);
  221.             if(!c) break;
  222.             DoMethod(c->win,CHAT_JOINACK);
  223.             break;
  224.         case NAPC_USERPART:
  225.             c = chat_findchan(nap_token(&data));
  226.             if(!c) break;
  227.             DoMethod(c->win,CHAT_USERPART,nap_token(&data));
  228.             break;
  229.         case NAPC_JOINMSG:
  230.         case NAPC_USERLIST:
  231.             c = chat_findchan(nap_token(&data));
  232.             if(!c) break;
  233.             DoMethod(c->win,CHAT_JOINMSG,nap_token(&data));
  234.             break;
  235. /*        case NAPC_USERLISTEND:
  236.             break; */
  237.         case NAPC_CHANNELTOPIC:
  238.             c = chat_findchan(nap_token(&data));
  239.             if(!c) break;
  240.             DoMethod(c->win,CHAT_CHANNELTOPIC,data);
  241.             break;
  242.  
  243.     }
  244. }
  245.  
  246.  
  247. channel chat_findchan(char *name)
  248. {
  249.     channel c = chat_chans;
  250.  
  251.     while(c) {
  252.         if(stricmp(c->name,name)==0) return(c);
  253.         c = c->next;
  254.     }
  255.     return(0);
  256. }
  257.